import pandas as pd
import numpy as np

# 设置随机种子以保证结果可重现
np.random.seed(42)

# 生成一个月的分钟级时间索引
dates = pd.date_range(start='2024-01-01', end='2024-01-31', freq='T')
n_periods = len(dates)

# 初始化DataFrame
df = pd.DataFrame(index=dates)

# 1. 模拟基础运行参数
df['inlet_pressure'] = np.random.normal(0.5, 0.02, n_periods)  # 进水压力，围绕0.5MPa波动
df['permeate_flow'] = np.random.normal(80, 5, n_periods)  # 产水流量，围绕80 m³/h波动
df['feed_temperature'] = np.random.normal(25, 2, n_periods)  # 进水温度，围绕25°C波动
df['feed_turbidity'] = np.maximum(np.random.normal(1.0, 0.3, n_periods), 0.1)  # 进水浊度，非负

# 2. 模拟跨膜压差的复杂变化（核心目标变量）
base_tmp = 0.1  # 初始TMP，单位MPa

# 模拟长期污染累积趋势（性能缓慢衰减）
long_term_decay = np.linspace(0, 0.05, n_periods)
# 模拟短期污染波动（如水质变化）
short_term_variation = 0.02 * np.sin(2 * np.pi * np.arange(n_periods) / (24*60))  # 24小时周期
# 模拟随机噪声
random_noise = np.random.normal(0, 0.005, n_periods)

# 合成基础TMP序列  跨膜压力
df['transmembrane_pressure'] = base_tmp + long_term_decay + short_term_variation + random_noise

# 3. 模拟反洗事件及其影响
# 每运行2小时左右进行一次反洗
backwash_interval = 120  # 分钟
backwash_indices = np.arange(backwash_interval, n_periods, backwash_interval)

# 反洗期间（假设持续1分钟），流量和压力归零
for idx in backwash_indices:
    if idx < n_periods:
        df.loc[df.index[idx], 'permeate_flow'] = 0
        df.loc[df.index[idx], 'transmembrane_pressure'] = 0
        # 反洗后，TMP会有一个显著的恢复（下降）
        recovery_effect = -0.015  # 反洗使TMP降低0.015MPa
        # 恢复效应在反洗后持续一段时间（模拟指数衰减）
        decay_steps = min(30, n_periods - idx - 1)
        for i in range(1, decay_steps + 1):
            df.loc[df.index[idx + i], 'transmembrane_pressure'] += recovery_effect * np.exp(-i / 10)

# 4. 模拟化学清洗事件（每2周一次）
chemical_clean_indices = np.arange(14*24*60, n_periods, 14*24*60)  # 每14天一次
for idx in chemical_clean_indices:
    if idx < n_periods:
        # 化学清洗后，TMP大幅恢复，接近初始值
        df.loc[df.index[idx]:, 'transmembrane_pressure'] -= 0.04

# 5. 计算衍生特征
# 标准化膜通量（简化计算，忽略粘度详细计算）
df['normalized_flux'] = df['permeate_flow'] / df['transmembrane_pressure'].replace(0, np.nan)
df['normalized_flux'].fillna(method='bfill', inplace=True)  # 反洗时刻用后面的值填充

# 单位产水TMP
df['tmp_per_output'] = df['transmembrane_pressure'] / df['permeate_flow'].replace(0, np.nan)
df['tmp_per_output'].fillna(method='bfill', inplace=True)

# 计算TMP变化率（使用15分钟滑动窗口）
df['tmp_change_rate'] = df['transmembrane_pressure'].diff(periods=15)

# 6. 添加标签 - 预测未来4小时的TMP
future_hours = 4
df['future_tmp'] = df['transmembrane_pressure'].shift(periods=-future_hours*60)

# 预览数据
print(df.head(10))
print(f"\n数据形状: {df.shape}")
print(f"\n数据概览:")
print(df.describe())

# 保存到CSV文件
df.to_csv('membrane_system_simulation_data.csv', index=True, encoding='utf-8-sig')